#封装基类
# 获取开启驱动
# 关闭驱动
#系统三个 也就是说 有网页版 和APP客户端
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from appium import webdriver as app_webdriver
class UtilsDriver:
    _driver1 = None
    @classmethod#定义第一个驱动 这是web端的驱动
    def Get_driver1(cls):
        if cls._driver1 is None:

           cls._driver1=webdriver.Chrome()#创建驱动
           cls._driver1.get("sssss")
           cls._driver1.maximize_window()#窗口最大化
           return cls._driver1#调用时记得返回
    @classmethod
    def Close_driver1(cls):
        if cls._driver1 is not None:
           cls.Get_driver1().close()#这里是将前置的归案掉
           cls._driver1 =None



class UtilsDriver2:#获取APP端的驱动
    _driver2=None
    @classmethod
    def Get_driver2(cls):
        if cls._driver2 is None:
            des_cap = {
                "platformName": "android",  # 基于安卓平台
                "platformVersion": '5.1.1',  # 基于测试机版本
                "deviceName": "*****",  # 四个星默认一个设备
                "appPackage": "com.hefhfwjfilw",  # 包名唯一 通过adb命令获取 adb shell dumpsys window| findstr “useApp”
                "appActivity": "ewwe",  # 界面名 不唯一·
                "noReset": True , # 记住app的session
                "resetKeyboard":True,#重置设备的输入键盘
                "unicodeKeyboard":True#设置可中文输入
            }

        cls._driver2 = app_webdriver.Remote("http//127.0.0.1:4723/wd/hub", des_cap)
        return cls._driver2
    @classmethod
    def Close_driver2(cls):
        if cls._driver2 is not None:
            cls.Get_driver2().quit()
            cls._driver2 =None


class UtilsDriver3:
    _driver3 = None
    _qiuet_driver3=True#退出驱动的标识
    @classmethod#定义第一个驱动 这是web端的驱动
    def Get_driver3(cls):
        if cls._driver3 is None:

           cls._driver3=webdriver.Chrome()#创建驱动
           cls._driver3.get("")
           cls._driver3.maximize_window()#窗口最大化
           return cls._driver3#调用时记得返回
    @classmethod
    def Close_driver3(cls):
        if cls._driver3 is not None and cls._qiuet_driver3:#如果驱动不为空并且为真
           cls.Get_driver3().close()#这里是将前置的归案掉8
           cls._driver3 =None

#封装一个选频道的方法 传驱动 传点的元素 传复选框中文本 三个对象
def choise_channel(driver,element,channel):
    element.click()#先点击元素
    time.sleep(1)#要等待 为什么等待防止点的太快
    #下面就是寻找什么呢 寻找具体的文本 那么为什么不同文本内容定位？
    # 因为复选框咋说 会出现在其他的页面中这里；老师推荐的是class的方法
    #那么方法就是先锁定整个内容的元素 ，先定位整个内容 ，
    # 定位好后 再根据//*[test()='{}'来选择我们复选框中的内容 ，通过.format(channel)将我们的文本参数传入就可以找到了
    xpath="//*[@class='ssaadd']//*[text()='{}']".format(channel)
    #下面代码啥意思 就是说 你找到了你具体想要的文本内容
    return driver.find_element(By.XPATH,xpath)
#判断发布是否成功
#进行msg断言 就可以了
def is_text_exist(driver,text):#定义一个寻找信息的方法
    #啥意思 就说 通过有我们传入的文本进行寻找元素 只要包含我们文本信息 就能找到这个元素
    xpath="//*[(contains(text(),'{}')]".format(text)
    #进行判断 啥意思 就是如果没找到就会报错 程序无法进行 那么最好的方法就是捕获异常 以免程序报错 耽误工作
    try:
        return driver.find_element(By.XPATH,xpath)#成功放回元素 失败直接报错
    except Exception as e:
        return False
def swipe_and_find(app_driver,element,element_tar):#查找值 现有元素 现有元素也就是我们所在找到的大元素
    # 目标元素 就是我们定义的
    #先获取驱动


    #找到路径

    #找到元素位置
    location=element.location
    #获取x坐标
    x=location["x"]
    # 获取y坐标
    y=location["y"]
    #找到元素大小
    size=element.size
    #获取
    width=size["width"]
    higth=size["higth"]
    start_x=x+width*0.1
    end_y=y+higth*0.5#高度不变 这样就可以了
    end_x=x+width*0.1
    #高度不变  宽度变化模拟运动

    #在不知道划多少次的情况下 要给一个while ture 死循环 为什么要给死循环 因为你不知道划多少次
    while True:
        APP_PAGE=app_driver.page_source#获取当前页面资源 这
        try:
          time.sleep(2)
          app_driver.find_element(*element_tar)#找到目标元素返回true  然后返回ture  循环停止
          return True
        except Exception as e:
            app_driver.swipe(start_x,end_y,end_x,end_y,daration=1500)
            if APP_PAGE==app_driver.page_source:
                print("已滑屏到最后页面，没有找到对应频道")
                return False






    #保存页面信息 如果查找内容在页
    #再捕获异常就可以了








